/*
 * DetalleGridVentas.java
 *
 * Created on 9 de noviembre de 2006, 05:54 PM
 */

package inc.jmc.cyberboard.ui.ventas;

import inc.jmc.cyberboard.AccountUser;
import inc.jmc.cyberboard.common.DefaultLookAndFeel;
import inc.jmc.cyberboard.common.NumFormat;
import inc.jmc.cyberboard.dao.AccountUserDao;
import inc.jmc.cyberboard.dao.Dao;
import inc.jmc.cyberboard.entitybeans.HistoricoVentas;
import inc.jmc.cyberboard.entitybeans.HistoricoVentasDetalle;
import inc.jmc.cyberboard.log.Log;
import inc.jmc.cyberboard.entitybeans.Productos;
import inc.jmc.cyberboard.ui.ventas.common.VentasDetalleKeyboardListener;
import inc.jmc.cyberboard.ui.ventas.common.VentasDetalleTableModel;
import inc.jmc.cyberboard.ui.ventas.common.VentasKeyboardListener;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.awt.event.KeyListener;
import java.sql.Connection;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.log4j.Logger;

/**
 *
 * @author  Juan Miguel Olguin Salguero
 */
public class DetalleGridVentas extends javax.swing.JPanel {
    static Logger logger = Logger.getLogger(DetalleGridVentas.class.getName());
    public static final Object[] header=new Object[]{"Item","Precio Unitario","Cantidad","Monto"};
    public static final int HEADER_ITEM           =0;
    public static final int HEADER_PRECIO_UNITARIO=1;
    public static final int HEADER_CANTIDAD       =2;
    public static final int HEADER_MONTO          =3;
    
    VentasDetalleTableModel dtm;
    VentasDetalleKeyboardListener keyListener = null;
    VentasFrm ventasParent;
    ArrayList dataProductos = new  ArrayList ();
    
    
    /** Creates new form DetalleGridVentas */
    public DetalleGridVentas(VentasFrm ventasParent) {
        initComponents();
        this.ventasParent = ventasParent;
        dtm=new VentasDetalleTableModel(new Object[][]{},header,ventasParent);
        updateTableUI();
        
                
    }
    
    public void addItems(ArrayList arry)
    {
        
        for(int i=0;i<arry.size();++i)
        {
            /////
            //Tomamos cada uno de los productos de la tabla de catalogo de productos
            //y por cada producto tomado, vamos asignando en cada columna de la nueva tabla los
            //datos de ese producto
            
            Productos record=(Productos)arry.get(i);
            Vector recVector=new Vector();
            recVector.add(record.getNombreCorto());
            recVector.add(NumFormat.money(record.getPrecio()));
            recVector.add("1");//cantidad
            recVector.add(NumFormat.money(record.getPrecio()));//monto
            recVector.add(record);
            dtm.addRow(recVector);
            this.dataProductos.add(record);
        }
        this.updateTableUI();
    }
    public void addItems(Productos record,int cantidad)
    {
        
            /////
            //Tomamos cada uno de los productos de la tabla de catalogo de productos
            //y por cada producto tomado, vamos asignando en cada columna de la nueva tabla los
            //datos de ese producto
            
            Vector recVector=new Vector();
            recVector.add(record.getNombreCorto());
            recVector.add(NumFormat.money(record.getPrecio()));
            recVector.add(""+cantidad);//cantidad
            recVector.add(NumFormat.money(cantidad * record.getPrecio().floatValue()));//monto
            recVector.add(record);
            dtm.addRow(recVector);
            this.dataProductos.add(record);
        
        this.updateTableUI();
    }
    public void selectAllItems()
    {
        this.productosTable.selectAll();
    
    }
    
    public void removeSelectedItems()
    {
        ArrayList dataProductosBack = new ArrayList();
        VentasDetalleTableModel dtmfiltered=new VentasDetalleTableModel(new Object[][]{},header,ventasParent);
        int[] ndxselected=this.productosTable.getSelectedRows();
        if(ndxselected.length==0)
            return;
        Vector data=dtm.getDataVector();
        int auxi=0;
        ///vamos a recorrer uno a uno los renglones del detalle de venta
        //y por cada id, lo vamos a comparar con la lista de ids a borrar.
        
        for(int i=0;i<data.size();++i)
        {
            int found=0;
            
            for(int j=0;j<ndxselected.length;++j)
            {
                if(i==ndxselected[j])
                {
                    found=1;
                    break;
                }
            }
            // si NO encontramos a ese id , en la lista de ids a borrar
            //entonces tenemos que agregar a ese renglon en el nuevo dtmodel
            //porque quiere decir que el no fue seleccionado para borrarse
            if(found==0)
            {
                Vector row=(Vector)data.get(i);
                dtmfiltered.addRow(row);
                
                Productos dataProducto=(Productos)this.dataProductos.get(i);
                dataProductosBack.add(dataProducto);
            }
        }
        ///copiamos el dtmodel nuevo al dtm, que usa el JTable ,
        /// y de esa manera se puedan ver los registros bien filtrados
        dtm = dtmfiltered;
        dataProductos=dataProductosBack;
        
        ///si es que ya se borraron todos los renglones de la tabla de detalle de venta, 
        //entonces vamos a quitar los datos que aparecen en las cifras de control de abajo.
        if(dtm.getRowCount()==0)
        {
            ventasParent.getVentaTotalTxt().setText("");
            ventasParent.getArticulosTxt().setText("");
            ventasParent.getIvaTxt().setText("");
            ventasParent.getSubtotalTxt().setText("");
            ventasParent.getPagoTxt().setText("");
            ventasParent.getCambioTxt().setText("");
        }
        this.updateTableUI();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        seleccionPopMenu = new javax.swing.JPopupMenu();
        selectAllItem = new javax.swing.JMenuItem();
        borrarItem = new javax.swing.JMenuItem();
        jScrollPane1 = new javax.swing.JScrollPane();
        productosTable = new javax.swing.JTable();

        selectAllItem.setText("Selecciona todo");
        selectAllItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                selectAllItemActionPerformed(evt);
            }
        });

        seleccionPopMenu.add(selectAllItem);

        borrarItem.setText("Borrar");
        borrarItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                borrarItemActionPerformed(evt);
            }
        });

        seleccionPopMenu.add(borrarItem);

        setLayout(new java.awt.BorderLayout());

        productosTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "TITULO 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        productosTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                productosTableMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                productosTableMouseReleased(evt);
            }
        });

        jScrollPane1.setViewportView(productosTable);

        add(jScrollPane1, java.awt.BorderLayout.CENTER);

    }// </editor-fold>//GEN-END:initComponents

    private void productosTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_productosTableMouseReleased
        logger.info("estamos sacando el menu contextual");
        if (evt.isPopupTrigger()) {
                this.seleccionPopMenu.show(evt.getComponent(),
                           evt.getX(), evt.getY());
            }
    }//GEN-LAST:event_productosTableMouseReleased

    private void productosTableMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_productosTableMousePressed

        logger.info("estamos sacando el menu contextual");
        if (evt.isPopupTrigger()) {
                this.seleccionPopMenu.show(evt.getComponent(),
                           evt.getX(), evt.getY());
            }
    }//GEN-LAST:event_productosTableMousePressed

    private void borrarItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_borrarItemActionPerformed
        this.removeSelectedItems();
    }//GEN-LAST:event_borrarItemActionPerformed

    private void selectAllItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllItemActionPerformed

        this.selectAllItems();
    }//GEN-LAST:event_selectAllItemActionPerformed

    public void updateTableUI()
    {
        productosTable=new JTable(dtm);
        productosTable.setDragEnabled(true);
        productosTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        jScrollPane1.setViewportView(productosTable);
        productosTable.setFont(DefaultLookAndFeel.TableFont);
        productosTable.setBackground(DefaultLookAndFeel.TableBackground);
        productosTable.setRowHeight(DefaultLookAndFeel.TableRowHeight);
        if(productosTable.getTableHeader()!=null)
          productosTable.getTableHeader().setReorderingAllowed(false);
        ///en caso de que haya al menos un elemento en el grid, ese lo seleccionamos 
        if(dtm.getRowCount()>0)
            this.productosTable.getSelectionModel().setSelectionInterval(0,0);
        productosTable.setColumnSelectionAllowed(false);
        this.setKeyListener();
        
        DefaultTableCellRenderer precioRenderer = new DefaultTableCellRenderer();
        precioRenderer.setHorizontalAlignment(JLabel.RIGHT);
        logger.info("Voy a ver si existe este numero DetalleGridVentas.HEADER_PRECIO_UNITARIO-->"+DetalleGridVentas.HEADER_PRECIO_UNITARIO);
        logger.info(""+DetalleGridVentas.HEADER_PRECIO_UNITARIO);
        TableColumn columnaAux=productosTable.getColumn(DetalleGridVentas.header[DetalleGridVentas.HEADER_PRECIO_UNITARIO]);
        columnaAux.setCellRenderer(precioRenderer);
        columnaAux=productosTable.getColumn(DetalleGridVentas.header[DetalleGridVentas.HEADER_MONTO]);
        columnaAux.setCellRenderer(precioRenderer);
        columnaAux=productosTable.getColumn(DetalleGridVentas.header[DetalleGridVentas.HEADER_CANTIDAD]);
        columnaAux.setCellRenderer(precioRenderer);
        JTextFieldMine1 jtf=new JTextFieldMine1();
        DefaultCellEditor ceEdit=new DefaultCellEditor (jtf);
        columnaAux=productosTable.getColumnModel().getColumn(DetalleGridVentas.HEADER_CANTIDAD);
        columnaAux.setCellEditor(ceEdit);
        productosTable.setIntercellSpacing(new Dimension(5, 2));
        productosTable.requestFocus();
        this.setMouseListenerPopUp();
        
    }
    public void setMouseListenerPopUp()
    {
        productosTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                productosTableMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                productosTableMouseReleased(evt);
            }
        });
    
    }
    private void setKeyListener()
    {
        KeyListener[] arryk=productosTable.getKeyListeners();
        for(int i=0;i<arryk.length;++i)
            productosTable.removeKeyListener(arryk[i]);
        keyListener = new VentasDetalleKeyboardListener(this);
        productosTable.addKeyListener(keyListener);
    }
    
    public HistoricoVentas getHistoricoVentasBean(int idUser)
    {
        HistoricoVentas venta;
        Vector dataVector1=dtm.getDataVector();
        int sizedetalleVenta = dataVector1.size();
        if(sizedetalleVenta == 0)
            return null;
        venta = new HistoricoVentas();
        AccountUserDao account = new AccountUserDao();
        venta.setIdUsuario(new Integer(idUser));
        String montoIvaaux=this.ventasParent.getIvaTxt().getText();
        String ventaTotalaux=this.ventasParent.getVentaTotalTxt().getText();
        String subtotalaux=this.ventasParent.getSubtotalTxt().getText();
        String cantidadaux=this.ventasParent.getArticulosTxt().getText();
        montoIvaaux=""+NumFormat.parseMoney(montoIvaaux);
        venta.setMontoIva(new Float(montoIvaaux));
        ventaTotalaux=""+NumFormat.parseMoney(ventaTotalaux);
        venta.setMontoTotal(new Float(ventaTotalaux));
        subtotalaux=""+NumFormat.parseMoney(subtotalaux);
        venta.setSubtotalNoIva(new Float(subtotalaux));
        venta.setCantidadItems(new Integer(cantidadaux));
        HistoricoVentasDetalle[] detalle = new HistoricoVentasDetalle[sizedetalleVenta];
        for(int i=0;i<sizedetalleVenta;++i)
        {
            detalle[i] = new HistoricoVentasDetalle();
            Vector rowVect = (Vector)dataVector1.get(i);
            Productos rowProduc1 = (Productos)this.dataProductos.get(i);
            ///obtenemos la cantidad
            String cantidad=(String)rowVect.get(DetalleGridVentas.HEADER_CANTIDAD);
            detalle[i].setCantidad(new Integer(cantidad));
            ///obtenemos IdProducto
            int idProducto1 = rowProduc1.getIdProducto().intValue();
            detalle[i].setIdProducto(new Integer(idProducto1));
            ///obtenemos PrecioUnitario
            float precioProducto1 = rowProduc1.getPrecio().floatValue();
            detalle[i].setPrecioUnitario(new Float(precioProducto1));
            ///obtenemos PrecioUnitario
            String subtotal1=(String)rowVect.get(DetalleGridVentas.HEADER_MONTO);
            subtotal1=""+NumFormat.parseMoney(subtotal1);
            detalle[i].setSubtotal(new Float(subtotal1));
            //AGREGAMOS LOS DATOS DE LA RENTA DE EQUIPO
            detalle[i].setHoraInicio(rowProduc1.getHoraInicio());
            detalle[i].setMaquina(rowProduc1.getMaquina());
            detalle[i].setHoraFin(rowProduc1.getHoraFin());
            
        }
        venta.setDetalle(detalle);
        return venta;
    }
            
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem borrarItem;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable productosTable;
    private javax.swing.JPopupMenu seleccionPopMenu;
    private javax.swing.JMenuItem selectAllItem;
    // End of variables declaration//GEN-END:variables
    
    class JTextFieldMine1 extends JTextField
    {
        public JTextFieldMine1 ()
        {
            super();
            ActionListener[] focusl=this.getActionListeners();
            for(int i=0;i<focusl.length;++i)
            {
                this.removeActionListener(focusl[i]);
            }
            this.addActionListener(new JTextFieldFocus(this));
            this.setFont(DefaultLookAndFeel.TableFont);
            this.selectAll();
            
        }
    }
    /*new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }*/
    class JTextFieldFocus implements java.awt.event.ActionListener
    {
        JTextField jtf;
        public JTextFieldFocus(JTextField jtf)
        {
            this.jtf = jtf;
        }
        //public void focusGained(java.awt.event.FocusEvent evt) {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
                jtf.selectAll();
            }
    }
}
